#include<iostream>
#include<string>
#include<ctime>
#include<unistd.h>
#include<pthread.h>
#include<stdio.h>
using namespace std;
//抢票实现


int tickets=100;
pthread_mutex_t mutex; //新建锁

// void * buy_ticket(void* argv)
// {
//     string tname =static_cast<const char*>(argv);
  
//     while(tickets)
//     {
//         pthread_mutex_lock(&mutex);  //加锁
//         if(tickets>0)
//         {
//             usleep(1000); //微秒级别的停留时间 这里是1毫秒
//             cout<<tname<<"get a ticket:"<<tickets--<<endl;
//             pthread_mutex_unlock(&mutex); //解锁
//         }
//         else 
//         {
//             pthread_mutex_unlock(&mutex); //解锁
//             break;
//         }

//         usleep(1000);
//     }

//     return nullptr;
// }



// int main()
// {
//     pthread_mutex_init(&mutex,nullptr); //初始化锁
//     pthread_t t[10];
//     int size=sizeof(t)/sizeof(t[0]);

//     for(int i=0;i<size;i++)
//     {
//         char *arr=new char[32];
//         snprintf(arr,128,"thread[%d]",i+1);
//         pthread_create(t+i,nullptr,buy_ticket,arr);
//     }

//     for(int i=0;i<size;i++)
//     {
//         pthread_join(t[i],nullptr); //线程回收
//     }
    
//     pthread_mutex_destroy(&mutex);


//     return 0;
// }



void * buy_ticket(void* argv)
{
    string tname =static_cast<const char*>(argv);
  
    while(tickets)
    {
        pthread_mutex_lock(&mutex);  //加锁
        if(tickets>0)
        {
            usleep(1000); //微秒级别的停留时间 这里是1毫秒
            cout<<tname<<"get a ticket:"<<tickets--<<endl;
            pthread_mutex_unlock(&mutex); //解锁
        }
        else 
        {
            pthread_mutex_unlock(&mutex); //解锁
            break;
        }

        usleep(1000);
    }

    return nullptr;
}








int main()
{
    pthread_mutex_init(&mutex,nullptr); //初始化锁
    pthread_t t[2];
    int size=sizeof(t)/sizeof(t[0]);

    for(int i=0;i<size;i++)
    {
        char *arr=new char[32];
        snprintf(arr,128,"thread[%d]",i+1);
        pthread_create(t+i,nullptr,buy_ticket,arr);
    }

    for(int i=0;i<size;i++)
    {
        pthread_join(t[i],nullptr); //线程回收
    }
    
    pthread_mutex_destroy(&mutex);


    return 0;
}